在JS中,我们经常会在句尾用到分号“;”,像许多其他编程语言一样,这是用来将语句分隔开。分号对提高代码的可读性和整洁性是不可缺少的。没有了分隔符,一条语句的末尾就成了下一条语句的起始。在JavaScript中,如果语句各自独占一行,通常可以不用语句之间的分号(程序结尾或右花括号“}”之前的分号也可以免去)。
关于JavaScript中可选分号的问题有几个细节需要注意。
1.
a = 3; b = 4;
因为两条语句用两行写,第一个分号是可以去掉的。
a = 3;b = 4;
如果按照如下规范书写,第一个分号则不能去掉
2.
如果当前语句和随后的非空格字符不能当成一个整体来解析的话,JavaScript就在当前语句行末尾添加分号。
var a a = 3 console.log(a)
JS将其解析为:
var a;a=3;console.log(a);
JavaScript给第一行换行处添加了分号,因为如果没有分号,JavaScript就无法解析代码var a a。第二个a可以单独当做一条语句"a;",但JavaScript并没有给第二行结尾填补分号,因为它可以和第三行内容一起解析成“a=3;”。
3.
var y=x+f (a+b).toString()
本是独立的两个语句,却会被解析成:
var y=x+f(a+b).toString();
通常来讲,如果一条语句以“(”、“[”、“/”、“+”或“-”开始,那么它极有可能和前一条语句合在一起解析。以“/”、“+”和“-”开始的语句并不常见,而以“(”和“[”开始的语句则非常常见,至少在一些JavaScript编码风格中是很普遍的。有些程序员喜欢保守地在语句前加上一个分号,这样哪怕之前的语句被修改了、分号被误删除了,当前语句还是会正确地解析:
4.
如果当前语句和下一行语句无法合并解析,JavaScript则在第一行后填补分号,这是通用规则,但有两个例外。第一个例外是在涉及return、break和continue语句的场景中。如果这三个关键字后紧跟着换行,JavaScript则会在换行处填补分号。
return true;
JavaScript会解析成:
return;true;
而代码的本意是这样:
return true;
第二个例外是在涉及“++”和“——”运算符的时候。这些运算符可以作为表达式的前缀,也可以当做表达式的后缀。如果将其用做后缀表达式,它和表达式应当在同一行。否则,行尾将填补分号,同“时“++”或“——”将会作为下一行代码的前缀操作符并与之一起解析,例如,这段代码:
x ++ y
这段代码将解析为
x;++y
而不是
x++;y